
export class MathUtil {


  // 静态方法:直接使用[类名.方法名]，或者[类名.属性名]调用
  // 没有运算符优先级
  static calculateNoPro(express:string):string {
    // 拿到所有的符号和数字
    // 先拿到所有的数字
    let numberList = express.split(/[+\-×÷]/g)
    // console.log('数字--->' + numberList.toString())
    // 再拿到所有的符号
    let operatorList = express.replace(/[\d\.]/g, '').split('')
    // console.info('符号--->' + operatorList.toString())
    let result = parseFloat(numberList[0])
    for (let i = 0; i < operatorList.length; i++) {
      result = this.calculateResult(result,
        parseFloat(numberList[i + 1]), operatorList[i])
    }
    return this.deleteZero(result.toFixed(10))
  }

  // 具有运算符优先级
  static calculate(express:string):string {
    if (/^\d+\.?\d*$/.test(express)) {
      return '0'
    }
    // 先拿到所有的数字
    let numberList = express.split(/[+\-×÷]/g)
    // 再拿到所有的符号
    let operatorList = express.replace(/[\d\.]/g, '').split('')
    // 当符号运算完毕，operatorList数组没有任何内容，结束
    // 存储当前运算的索引和符号
    let index = 0
    let operator = ''
    while(operatorList.length > 0) {
      // 判断这个符号数组中是否有×÷
      index = this.divideOrMultiply(operatorList)
      if (index != -1) {
        // 存在×÷，index就是这个×÷的索引
        // 获取这个索引×÷的符号
        operator = operatorList[index]
      } else {
        // 只有+-，从头算到尾
        index = 0 // 获取第一个数字的索引
        operator = operatorList[0] // 获取第一个符号
      }
      // 开始计算
      let num1 = parseFloat(numberList[index]) // 第一个数字
      let num2 = parseFloat(numberList[index + 1]) // 第二个数字
      // 开始计算，并得到当前计算的结果
      let result = this.calculateResult(num1, num2, operator)
      // 删除当前索引对应的数字，index：删除的索引  1：删除的数量
      numberList.splice(index, 1)
      // 将运算的结果放入到当前的索引下
      numberList[index] = `${result}`
      // 删除运算符
      operatorList.splice(index, 1)
    }
    return this.deleteZero(parseFloat(numberList[0]).toFixed(10))
  }

  // 判断一个数组中是否有×÷符号，有的话得到索引
  static divideOrMultiply(operatorList:Array<string>):number {
    for (var i = 0; i < operatorList.length; i++) {
      if (operatorList[i] === '×' || operatorList[i] === '÷') {
        // 找到了×÷，返回对应的索引
        return i
      }
    }
    // 未找到×÷得到-1
    return -1
  }



  // 如果是整数，去掉多余的0
  static deleteZero(result:string) {
    for (let i = result.length -1; i >= 0; i--) {
      if (result.charAt(i) !== '0') {
        return result.substring(0, result.charAt(i) === '.' ? i : i + 1)
      }
    }
    return result
  }

  // 运算两个数字的结果
  static calculateResult(num1:number, num2: number, operator:string): number {
    switch (operator) {
      case '+':
        return num1 + num2
      case '-':
        return num1 - num2
      case '×':
        return num1 * num2
      case '÷':
        return num1 / num2
    }
    return 0
  }

}